说明

这俩Hash算法着重记录一下,因为SAM数据库中存储的信息就包含这俩,示例条目内容如下:

Administrator:500:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0:::
  • AAD3B435B51404EEAAD3B435B51404EE: LM Hash(空密码)
  • 31D6CFE0D16AE931B73C59D7E0C089C0: NTLM Hash(空密码)

LM Hash

LM Hash(LAN Manager Hash)是Windows NT之前的版本中引入的的一种密码哈希算法。

计算过程

  1. 用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。(28个16进制字符)。
  2. 密码的16进制字符串分成两个7字节(14个16进制字符)的部分。每个部分都会转换为比特流(二进制流如0101),长度为56位。如果比特流长度不足56位,则在左边使用0进行补齐。
  3. 将每个比特流分成8组,每组7位,并在每组的末尾添加一个0,形成8组长度为8位的比特流。
  4. 对上述步骤得到的两组比特流分别使用密钥"KGS!@#$%"进行DES加密。
  5. 最后将两组加密后的比特流拼接在一起,得到最终的LM Hash值。
from passlib.hash import lmhash

password = "123456"
lm_hash = lmhash.encrypt(password)

print("LM Hash: " + lm_hash) # 44efce164ab921caaad3b435b51404ee

安全问题

  1. 密码最多支持14个字符,并且将密码转换为大写形式,限制了密码的复杂性和强度。
  2. 使用固定的密钥"KGS!@#$%"进行DES加密,如果hash后16位是aad3b435b51404ee,那么就说明明文长度小于等于7。
  3. DES密钥长度较短(56位),容易受到暴力破解和彩虹表攻击

NTLM Hash

NTLM Hash(NT LAN Manager Hash)是在Windows NT 操作系统中引入的,它是LM Hash的改进版本。

对比如下:

img

可见从Vista后,默认情况下不存储LM Hash,只存储NTLM Hash。这也是为什么后期我们抓到的LM Hash都是AAD3B435B51404EEAAD3B435B51404EE(空密码)。

一些工具强制要求LM Hash: NTLM Hash的格式,我么可以把LM Hash部分全写成0,如00000000000000000000000000000000:31D6CFE0D16AE931B73C59D7E0C089C0

计算过程

  1. 将密码转换为十六进制
  2. 对结果进行unicode编码(即每个字节之后添加0x00
  3. 使用MD4摘要算法对Unicode编码数据进行Hash计算
python2 -c 'import hashlib,binascii; print binascii.hexlify(hashlib.new("md4", "admin".encode("utf-16le")).digest())'

# 1. admin => 61646D696E
# 2. 61646D696E => 610064006D0069006E00
# 3. 610064006D0069006E00 => 209c6174da490caeb422f3fa5a7ae634
Copyright © d4m1ts 2023 all right reserved,powered by Gitbook该文章修订时间: 2023-06-25 17:30:12

results matching ""

    No results matching ""